#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> //sockaddr_in
#include <arpa/inet.h>
#include <string.h>     //memset()
#include <stdlib.h>     //system()
#include <iostream>
#include <fstream>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
using namespace std;
#include "socket_sender.h"
#include "log_reader.h"
#include "data.h"
#include "except.h"

const char* server_IP = "127.0.0.1"; //设置为全局变量放在最开始，方便以后做变化
short server_PORT = 6666;  //设置为全局变量放在最开始，方便以后做变化

SocketSender::SocketSender(){
}

SocketSender::~SocketSender()
{
    close(socket_fd);
    close(connent_fd);
}

//创建到服务器的连接。
void SocketSender::connectServer(){
	
	cout << "开始连接服务器..." << endl << endl;
	sleep(2);
	
	//给客户端设置一个socket
	socket_fd = socket(AF_INET,SOCK_STREAM,0);
    if (socket_fd < 0)
    {
        throw SocketException("为客户端创建socket失败！");
    }
    else
    {	
        cout<<"成功为客户端创建socket."<< endl << endl;
        sleep(2);
    }
    
    //准备通信地址
    struct sockaddr_in server_sockaddr = {};
    server_sockaddr.sin_family=AF_INET;
    server_sockaddr.sin_addr.s_addr=inet_addr(server_IP);
    server_sockaddr.sin_port=htons(server_PORT);
    
    //发出连接服务器请求
    int connet_fd=connect(socket_fd, (struct sockaddr *)& server_sockaddr, sizeof(struct sockaddr));
    if (connet_fd < 0)
    {
        throw SocketException("连接服务器失败，请重试！");
    }
    cout<<"连接服务器成功！"<< endl <<endl;
    sleep(2); //睡眠2秒钟
}


//通过套接字连接将匹配的日志记录发送到服务器。
void SocketSender::sendData(list<MatchedLogRec> & matched_log){
	
	//记录有多少个已发送的匹配日志记录
	int num_send_log=0;
	
	cout<<"开始发送已匹配的登录日志记录到服务器..."<< endl << endl;
	sleep(2);
	
    int send_num; //记录发送的数据的大小，作为是否发送成功的依据
    
    //开始发送
    for (list<MatchedLogRec>::iterator it = matched_log.begin(); it != matched_log.end(); )
    {
        sleep(0.02);
        
        //发送一条记录就记录一下实际发送记录的数据大小
        send_num = send(socket_fd, (void *)& (*it), sizeof(MatchedLogRec), 0);
        
        if (send_num < 0)
        {	//发送失败
            throw SendException("发送已匹配的登录日志记录到服务器失败，请重试！");
        }
        else
        {	
            cout<<"成功发送一条已匹配的登录日志记录到服务器..."<< endl << endl;
            sleep(0.1);
           
            ++num_send_log; //记录总发送的已匹配的登录日志记录的条数
            
            it = matched_log.erase(it); //从迭代器中删除当前元素并返回指向下一个元素的迭代器
        }
    }
    cout << "成功发送所有已匹配的登录日志记录到服务器！" << endl << endl;
    cout << "发送已匹配的登录日志记录共: " << num_send_log << "条！" << endl << endl;
	
}

//发送日志到服务器
void SocketSender::sendLog(list<MatchedLogRec> & matched_log) throw(ClientException)
{
    connectServer();               //创建到服务器的连接。
    sendData(matched_log);         //通过套接字连接将匹配的日志记录发送到服务器。    
}

